package com.kizuki.algorithm.leetcode;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 给定一个二叉树的根节点 root ，返回 它的 中序 遍历 。
 *
 * https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
 */
public class 二叉树的中序遍历 {

    class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
            List<Integer> list = new ArrayList<>();
            inorderTraversal0(root, list);
            return list;
        }

        private void inorderTraversal0(TreeNode root, List<Integer> list) {
            if (root == null) {
                return;
            }
            inorderTraversal0(root.left, list);
            list.add(root.val);
            inorderTraversal0(root.right, list);
        }


        // 非递归版本
        public List<Integer> inorderTraversal1(TreeNode root) {
            List<Integer> list = new ArrayList<>();
            if (root == null) {
                return list;
            }
            TreeNode pNode = root;
            LinkedList<TreeNode> stack = new LinkedList<>();
            while (pNode != null || !stack.isEmpty()) {
                if (pNode != null) {
                    stack.push(pNode);
                    // list.add(node.val); 先序遍历只需要修改加入list的时机
                    pNode = pNode.left;
                } else {
                    TreeNode node = stack.pop();
                    list.add(node.val);
                    pNode = node.right;
                }
            }
            return list;
        }

    }

}
